package com.cn.yunhe.rentcars.captcah;

import java.awt.Image;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * 验证码创建者抽象类。它只实现了@see pub.greenbamboo.captcha.Captcha接口。
 *
 * @author 赵志学
 * @date 2016-8-3
 * @version v0.1
 */
public abstract class AbstractCaptcha implements Captcha {

    protected List<ImageCode> list;//验证码图像和验证码缓存裂表。
    protected Random random = new Random();
    protected int width = 100;//图片宽
    protected int height = 40;//图片高
    protected int codeLength = 4;//验证码个数
    private String cv;
    
    public AbstractCaptcha() {
        list = Collections.synchronizedList(new LinkedList<ImageCode>());
    }

    public String getCv() {
		return cv;
	}

	public void setCv(String cv) {
		this.cv = cv;
	}

	/**
     * 获取验证码图像和验证码。
     *
     * @return 返回验证码图像和验证码。
     */
    @Override
    public ImageCode getImageCode() {
        int size = list.size();
        if (size < 1000) {
            ImageCode nvp = generateCodeImage();
            list.add(nvp);
            return nvp;
        } else {
            return list.get(random.nextInt(size));
        }
    }

    /**
     * 创建图像验证码。
     *
     * @return 返回图像验证码。
     */
    public ImageCode generateCodeImage() {
    	//调用抽象方法，循环取得指定数量的字符，次抽象方法需在继承类里面实现。并重载。
        String captcha = generateCaptchaString();
         cv = captcha;  
       // System.out.println(captcha);//打印获取到的字符。
        //调用创建图片验证码抽象方法，同样是在子类中实现。并将上面获取到的字符串传递作为参数。
        Image captchaImage = generateCaptchaImage(captcha);
        ImageCode imageCode = new ImageCode(captchaImage, captcha);
        return imageCode;
    }

    /**
     * 创建验证码字符串。
     *
     * @return 返回验证码字符串。
     */
    public abstract String generateCaptchaString();

    /**
     * 创建验证码图像。
     *
     * @param code 输入的验证码字符串。
     * @return 返回验证码图像。
     */
    public abstract Image generateCaptchaImage(String code);

    @Override
    public boolean checkCaptcha(String code, String clientCode) {
        if (code == null || clientCode == null || code.isEmpty() || clientCode.isEmpty() || code.length() != codeLength) {
            return false;
        }
        return code.equals(clientCode);
    }

}
